DMLNameProvider.java
package org.codefilarete.stalactite.query.builder;
import javax.annotation.Nullable;
import java.util.Map;
import java.util.function.Function;
import org.codefilarete.stalactite.query.model.Fromable;
import org.codefilarete.stalactite.query.model.JoinLink;
import org.codefilarete.stalactite.query.model.Selectable;
import org.codefilarete.tool.Strings;
/**
* A simple wrapper for methods that can give some necessary names during DML generation.
*
* @author Guillaume Mary
*/
public class DMLNameProvider {
private final Function<Fromable, String> tableAliaser;
public DMLNameProvider(Function<Fromable, String> tableAliaser) {
this.tableAliaser = tableAliaser;
}
public DMLNameProvider(Map<? extends Fromable, String> tableAliases) {
this(tableAliases::get);
}
/**
* Gives a column name with table "path" (either alias or name according to {@link #getTablePrefix(Fromable)})
* @param column a column
* @return the column name prefixed with table name/alias
*/
public String getName(Selectable<?> column) {
if (column instanceof JoinLink) {
String tablePrefix = getTablePrefix(((JoinLink<?, ?>) column).getOwner());
return tablePrefix + "." + getSimpleName(column);
} else {
return getSimpleName(column);
}
}
/**
* Gives the column name (without table name).
* Aimed at being overridden to take keywords into account (and put it between quotes for instance)
*
* @param column a column
* @return the column name (eventually escaped)
*/
public String getSimpleName(Selectable<?> column) {
return column.getExpression();
}
@Nullable
public String getAlias(Fromable table) {
return tableAliaser.apply(table);
}
/**
* Returns table alias if not empty or table name.
* @param table a table, or by extension everything that can be put in a From clause
* @return the table alias or table name
*/
public String getTablePrefix(Fromable table) {
String tableAlias = getAlias(table);
return Strings.isEmpty(tableAlias) ? getName(table) : tableAlias;
}
/**
* Gives the table name.
* Aimed at being overridden to take keywords into account (and put result between quotes for instance)
*
* @param table a table
* @return the table name (eventually escaped)
*/
public String getName(Fromable table) {
return table.getAbsoluteName();
}
}